package com.codi.fcloud.ufx.hssale.query;

import com.codi.base.log.annotation.Loggable;
import com.codi.base.util.ExceptionUtil;
import com.codi.base.util.StringUtil;
import com.codi.bus.exception.HundsunAPIException;
import com.codi.fcloud.ufx.HsUtil;
import com.codi.fcloud.ufx.UfxSDKFactory;
import com.codi.fcloud.ufx.constant.HSInputParameterNames;
import com.codi.fcloud.ufx.constant.UrlConstants;
import com.codi.trade.dto.HsAccoBankQueryDto;
import com.codi.trade.response.HsAccoBankQueryResponse;
import com.codi.trade.service.AccountBankQueryService;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service("accountBankQueryService")
public class AccountBankQuery extends UfxSDKFactory implements AccountBankQueryService {

    // 客户银行帐号查询
    @Loggable
    @Override
    public Map<String, Object> query(Integer requestNum, Integer queryFlag, Integer beginNum, String sortDirection,
                                     String tradeAccount, String clientId, String capitalMode) {

        try {

            // 获取第一页
            Map<String, Object> request = getRequestParams(requestNum, queryFlag, beginNum, sortDirection, tradeAccount,
                clientId, capitalMode);

            List<Map<String, Object>> response = getUfxSDK().query(getTarget(), request);

            // 如果requestNum是我们系统定义的最大值，则表明数据需要全部取出来
            getNextResponse(request, response, requestNum);

            return appendLog(request, response);
        } catch (Exception exception) {
            ExceptionUtil.logError(logger, getTarget(), exception);
            throw new HundsunAPIException(ExceptionUtil.getMessage(exception));
        }
    }

    @Loggable
    @Override
    public List<HsAccoBankQueryResponse> query(HsAccoBankQueryDto dto) {
        String trustWay = apiValueMap.get(HSInputParameterNames.TRUST_WAY);

        Map<String, Object> request = new HashMap<>();

        request.put("trust_way", trustWay); //	C1	交易委托方式	Y
        request.put("net_no", getString(dto.getNet_no(), DEF_NET_NO)); //	C9	网点代码	N	不传则使用默认值"0001" ，有传值（包括空）则使用所传值
        request.put("request_num", getString(dto.getRequest_num(), "50")); //	N8	请求行数	Y	最大不能超过50；即最大返回记录条数不会超过50条；
        request.put("reqry_recordsum_flag", getString(dto.getReqry_recordsum_flag())); //	C1	重新统计总记录数标志	N	0-不重新统计；1-重新统计；
        request.put("qry_beginrownum", getString(dto.getQry_beginrownum())); //	N8	查询起始行号	N	比如总记录是100，每50条分页；那么需要查询2次；第1次查询请求行数传50，重新统计总记录数传1，查询起始行号private String 传1；第2次查询请求行数传50，重新统计总记录数传0，查询起始行号传51；
        request.put("sort_direction", getString(dto.getSort_direction())); //	C1	返回排序方式	N
        request.put("trade_acco", getString(dto.getTrade_acco())); //	C17	交易账号	N	交易账号与客户编号至少有一个为必填项
        request.put("ta_acco", getString(dto.getTa_acco())); //	C12	TA账号	N
        request.put("client_id", getString(dto.getClient_id())); //	C17	客户编号	N	交易账号与客户编号至少有一个为必填项
        request.put("capital_mode", getString(dto.getCapital_mode())); //	C1	资金方式	N
        request.put("trade_source", getString(dto.getTrade_source())); //	C12	交易来源	N
        request.put("bank_no", getString(dto.getBank_no())); //	C3	银行代码	N

        try {
            //
            List<Map<String, Object>> response = getUfxSDK().query(getTarget(), request);

            return HsUtil.convertList(appendLog(request, response), HsAccoBankQueryResponse.class);

        } catch (Exception exception) {
            ExceptionUtil.logError(logger, getTarget(), exception);
            throw new HundsunAPIException(ExceptionUtil.getMessage(exception));
        }
    }

    @Override
    protected String getTarget() {
        return UrlConstants.PREFIX_SALE + UrlConstants.ACCOBANK_QRY;
    }

    /**
     * 获取请求参数
     *
     * @param requestNum
     * @param queryFlag
     * @param beginNum
     * @param sortDirection
     * @param tradeAccount
     * @param clientId
     * @param capitalMode
     * @return
     */
    private Map<String, Object> getRequestParams(Integer requestNum, Integer queryFlag, Integer beginNum,
                                                 String sortDirection, String tradeAccount, String clientId, String capitalMode) {
        String              trustWay = apiValueMap.get(HSInputParameterNames.TRUST_WAY);
        Map<String, Object> request  = new HashMap<String, Object>();
        request.put("trust_way", trustWay); // 交易委托方式
        request.put("request_num", requestNum); // 请求行数
        request.put("reqry_recordsum_flag", queryFlag); // 重新统计总记录数标志
        request.put("qry_beginrownum", beginNum); // 查询起始行号
        request.put("sort_direction", sortDirection); // 返回排序方式
        request.put("trade_acco", StringUtil.isEmpty(tradeAccount) ? "" : tradeAccount); // 交易帐号
        request.put("ta_acco", "");// TA账号
        request.put("client_id", StringUtil.isEmpty(clientId) ? "" : clientId); // 客户编号
        request.put("capital_mode", StringUtil.isEmpty(capitalMode) ? "" : capitalMode);// 资金方式
        request.put("trade_source", ""); // 交易来源
        request.put("bank_no", ""); // 银行代码

        return request;
    }

}
